www.gusucode.com > matlab最优化程序源码---书籍 > matlab最优化程序/光盘程序/第14章 遗传优化算法/GMGA.m
function [xv,fv]=GMGA(fitness,a,b,NP,NG,Pc,Pm,alpha,Pbm,eps) %大变异遗传算法 L = ceil(log2((b-a)/eps+1)); x = zeros(NP,L); for i=1:NP x(i,:) = Initial(L); fx(i) = fitness(Dec(a,b,x(i,:),L)); end for k=1:NG sumfx = sum(fx); favg = sumfx/NP; [fmax,xmax] = max(fx); if k<NG/2 if fmax*alpha<favg rm = rand(); if rm < Pbm for i=1:(xmax-1) gmPos = round(rand*(L-1)+1); x(i,gmPos) = ~x(i,gmPos); fx(i) = fitness(Dec(a,b,x(i,:),L)); end for i=(xmax+1):NP gmPos = round(rand*(L-1)+1); x(i,gmPos) = ~x(i,gmPos); fx(i) = fitness(Dec(a,b,x(i,:),L)); end continue; end end end Px = fx/sumfx; PPx = 0; PPx(1) = Px(1); for i=2:NP PPx(i) = PPx(i-1) + Px(i); end for i=1:NP sita = rand(); for n=1:NP if sita <= PPx(n) SelFather = n; break; end end Selmother = round(rand()*(NP-1))+1; posCut = round(rand()*(L-2)) + 1; r1 = rand(); if r1<=Pc nx(i,1:posCut) = x(SelFather,1:posCut); nx(i,(posCut+1):L) = x(Selmother,(posCut+1):L); r2 = rand(); if r2 <= Pm posMut = round(rand()*(L-1) + 1); nx(i,posMut) = ~nx(i,posMut); end else nx(i,:) = x(SelFather,:); end end x = nx; for i=1:NP fx(i) = fitness(Dec(a,b,x(i,:),L)); end end fv = -inf; for i=1:NP fitx = fitness(Dec(a,b,x(i,:),L)); if fitx > fv fv = fitx; xv = Dec(a,b,x(i,:),L); end end function result = Initial(length) for i=1:length r = rand(); result(i) = round(r); end function y = Dec(a,b,x,L) base = 2.^((L-1):-1:0); y = dot(base,x); y = a + y*(b-a)/(2^L-1);